home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / tdoodle.arc / TDOODLE.ASM next >
Assembly Source File  |  1980-01-01  |  49KB  |  1,971 lines

  1. comment * WordStar Tab Ruler
  2. L-------!-------!---------------!----!----!----!----!----!----!----!---------------------------R
  3. 12-5-85
  4. *
  5. cseg segment para public 'code'
  6. assume cs:cseg,ds:cseg,es:cseg,ss:cseg
  7.  
  8.  
  9. len_picture=2289
  10.  
  11.         org     0h
  12. Zero:                           ;ret to DOS
  13.         org     100h
  14. start:  jmp     init            ;goto initialization routine
  15.  
  16. buffer          db 256 dup(?)
  17. handle          dw ?
  18. char            db ?
  19. filespec_buffer db 256 dup(?) 
  20.  
  21. screen_page     db ?
  22. attrib          db ?
  23. mode            db ?
  24. say_color_flag  db 0
  25. cursor          label word
  26.  
  27. max_line        db ?
  28. cur_line        db ?
  29. max_col         db ?
  30. cur_col         db ?
  31. create          db ?
  32. rotate          db ?
  33. space_size      db ?
  34. ins_del_flag    db ?
  35.  
  36. cursor_size     dw ?
  37. screen_seg      dw ?
  38. screen_buffer   dw ?
  39.  
  40. paste_size      dw ?            ; y/x size of paste_buffer
  41. last_x          db ?
  42. last_y          db ?
  43. block_cursor    label word
  44.  cursor_x       db ?
  45.  cursor_y       db ?
  46. quad            db ?
  47. wrap_flag       db ?
  48.  
  49. esc=27
  50.  
  51. getkey  macro 
  52.         call    get_keystroke
  53.         endm
  54.  
  55. get_keystroke:
  56.         mov     ah,1
  57.         int     16h
  58.         jz      GK_ret
  59.         pushf
  60.         mov     ah,0
  61.         int     16h
  62.         popf    
  63. GK_ret: ret
  64.  
  65. jump    macro table,item
  66.         mov     bx,offset table
  67.         mov     al,item
  68.         call    table_jump
  69.         endm
  70. ;
  71. search  macro   table,item
  72.         mov     bx,offset table
  73.         mov     ax,item
  74.         call    table_search
  75.         endm
  76. ;
  77. table_jump:
  78.         cmp     cs:[bx],al         ;too big an offset?
  79.         jc      TJ_end
  80.         dec     bx
  81.         mov     ah,0
  82.         add     ax,ax           ;prep offset
  83.         add     bx,ax           ;get actual addr of routine
  84.         jmp     word ptr cs:[bx]     ;go to routine
  85. TJ_end: ret
  86. ;
  87. table_search:
  88.         push    bx
  89.         push    cx              ;search table @ BX for AL
  90.         push    dx
  91.         push    di
  92.         or      al,al           ;2-byter
  93.         jz      TS_10           ;yes, don't clear top
  94.         mov     ah,0            ;otherwise...
  95.         call    capit_al
  96. TS_10:  mov     cl,[bx]         ;get len of $ to search
  97.         mov     ch,0
  98.         mov     di,bx
  99. TS_5:   inc     di              ;skip length
  100.         mov     dx,[di]         ;get table entry
  101.         or      dl,dl           ;test for 2-byter
  102.         jnz     TS_2            ;no
  103.         inc     di
  104.         jmp short TS_3
  105. TS_2:   mov     dh,0            ;clear top byte for cmp
  106. TS_3:   cmp     ax,dx           ;are they the same?
  107.         je      TS_4            ;go if they are
  108.         loop    TS_5            ;else go to end of table
  109.         jmp short TS_1          ;done but not found
  110. TS_4:   mov     ch,[bx]         ;get len of table again
  111.         sub     ch,cl           ;get offset into table
  112.         mov     ah,ch           ;get offset into ah
  113.         inc     ah              ;make go from 1
  114.         xor     bx,bx           ;set flags
  115. TS_1:   pop     di
  116.         pop     dx
  117.         pop     cx
  118.         pop     bx
  119.         ret
  120. ;
  121. capit_al:
  122.         cmp     al,'a'
  123.         jc      CA_1
  124.         cmp     al,'z'+1
  125.         jnc     CA_1
  126.         sub     al,32
  127. CA_1:   ret
  128.  
  129. retf    macro   pop_value
  130.  ifb <pop_value>
  131.         db      0cbH            ;far ret w/no [pop-value]
  132.  else
  133.         db      0caH            ;far ret w/pop-value
  134.         dw      pop_value
  135.  endif
  136.         endm
  137. ;
  138.  
  139. ceol db esc,'[K$'
  140.  
  141. print_cs_space:
  142.         mov     ah,9
  143.         int     21h
  144.         mov     dl,32
  145.         mov     ah,2
  146.         int     21h
  147.         ret
  148.  
  149. print_cs:
  150.         mov     ah,9
  151.         int     21h
  152.         mov     dx,offset ceol
  153.         mov     ah,9
  154.         int     21h
  155.         ret
  156.  
  157.  
  158. save_screen:
  159.         mov     si,0
  160.         mov     di,[screen_buffer]
  161.         mov     ax,screen_seg
  162.         mov     ds,ax
  163.         mov     cx,1760
  164.         rep     movsw
  165.         mov     ax,es
  166.         mov     ds,ax
  167.         ret
  168.  
  169. MU_undo:
  170. restore_screen:
  171.         pushf
  172.         push    ax
  173.         push    cx
  174.         push    si
  175.         push    di
  176.         mov     ax,screen_seg
  177.         mov     es,ax
  178.         mov     si,[screen_buffer]
  179.         mov     di,0
  180.         mov     cx,1760
  181.         rep     movsw
  182.         mov     ax,ds
  183.         mov     es,ax
  184.         pop     di
  185.         pop     si
  186.         pop     cx
  187.         pop     ax
  188.         popf
  189.         ret
  190.  
  191.  
  192. memory_error db 'Memory allocation error (not enough, or bad allocation blocks)',13,10,10
  193.  
  194. break_handler:
  195.         iret
  196.  
  197. No_parm:
  198.         call    cls
  199.         mov     cx,len_picture
  200.         mov     dx,offset screen_buffer_1
  201.         mov     bx,0            ;CON
  202.         mov     ah,40h          ;write to file
  203.         int     21h
  204. np_1:   getkey
  205.         jnz     np_1
  206. np_2:   getkey
  207.         jz      np_2
  208.  
  209.         call    cls
  210.         jmp     editor
  211.  
  212. bad_dos_version db 'tDoodle 1.00: Incorrect DOS Version.$'
  213.  
  214. parm_error_so:
  215.         jmp     parm_error
  216.  
  217. ;************* Start *********************
  218. init:   mov     ah,30h
  219.         int     21h             ;get DOS ver #
  220.         cmp     al,2
  221.         jae     init_9
  222.         mov     dx,offset bad_dos_version
  223.         mov     ah,9
  224.         int     21h
  225.         jmp     zero
  226.  
  227. init_9: mov     bx,offset end_of_code
  228.         mov     cl,4
  229.         shr     bx,cl           ;turn byte count into para's
  230.         inc     bx
  231.         mov     ah,4Ah
  232.         int     21h
  233.         jnc     init_10
  234.         mov     dx,offset Memory_error
  235.         call    print_cs
  236.         jmp     zero
  237.  
  238. no_parm_so: 
  239.         jmp no_parm
  240.  
  241. init_10:
  242.         mov     ah,25h          ;get ^Break addr
  243.         mov     al,23h          ;^BREAK int #
  244.         mov     dx,offset Break_handler
  245.         int     21h
  246.         
  247.         mov     ah,3
  248.         int     10h             ;get cursor size
  249.         mov     cursor_size,cx
  250.         call    fix_cursor_block
  251.  
  252.         mov     screen_buffer,offset screen_buffer_1
  253.         
  254.         mov     di,offset filespec_buffer
  255.         mov     al,64
  256.         stosb
  257.  
  258.         mov     si,80h          ;parameter addr
  259.         lodsb                   ;get len of command$
  260.         mov     bl,al
  261.         mov     bh,0
  262.         or      bl,bh           ;is len(parm)=0?
  263.         jz      No_Parm_so
  264.         mov     byte ptr [si+bx],0   ;terminate ASCIIZ
  265.  
  266. init_loop_1:
  267.         lodsb                   ;get char of $
  268.         or      al,al           ;EOS?
  269.         jz      Parm_error_so
  270.         cmp     al,13           ;EOS?
  271.         jz      Parm_error_so
  272.         cmp     al,9            ;nothing?
  273.         jz      init_loop_1
  274.         cmp     al,32           ;space?
  275.         jz      init_loop_1
  276.         dec     si
  277.  
  278.         push    si
  279.         mov     cl,0
  280.         inc     di
  281. init_1: lodsb
  282.         stosb
  283.         inc     cl
  284.         cmp     al,0            ;EOS?
  285.         jne     init_1
  286.         dec     cl
  287.         mov     byte ptr [filespec_buffer+1],cl
  288.         pop     si
  289.  
  290.         mov     dx,si
  291.         mov     al,2            ;open for r/w
  292.         mov     ah,3Dh
  293.         int     21h             ;open file
  294.         jnc     Load_File_so
  295.         cmp     al,2
  296.         jnz     File_open_error
  297.         mov     dx,si
  298.         mov     ah,3Ch
  299.         mov     cx,0
  300.         int     21h
  301.         jc      File_open_error
  302. Load_file_so:
  303.         jmp     Load_file
  304.  
  305. Parm_error_message db 'Bad parameter line',13,10,'$'
  306. File_open_error_message db 'Couldn',27h,'t open file',13,10,'$'
  307. Load_error_message db 'Had trouble loading file.',13,10,'$'
  308.  
  309. Parm_error:
  310.         mov     dx,offset Parm_error_message
  311.         call    print_cs
  312.         jmp     ret_to_dos
  313. File_open_error:
  314.         mov     dx,offset File_open_error_message
  315.         call    print_cs
  316.         jmp     ret_to_dos
  317. Load_error:
  318.         mov     byte ptr [di-1],13
  319.         mov     bx,handle
  320.         mov     ah,3Eh
  321.         int     21h
  322.         mov     dx,offset Load_error_message
  323.         call    print_cs
  324. Ret_to_DOS_2:
  325. Ret_to_DOS:
  326.         jmp     Zero
  327.  
  328. cls_string db esc,'[=2h',esc,'[?7h',esc,'[0m',esc,'[2J','$'
  329.  
  330. cls:    mov     dx,offset cls_string
  331.         call    print_cs
  332.         mov     attrib,7
  333.         call    fix_cursor_block
  334.         ret
  335.  
  336. Load_File:
  337.         mov     handle,ax
  338.  
  339.         call    cls
  340. Load_loop:
  341.         mov     bx,handle
  342.         mov     ah,3Fh
  343.         mov     cx,1
  344.         mov     dx,offset buffer
  345.         int     21h
  346.         jc      Load_Error
  347.         or      ax,ax
  348.         jz      Load_Ended
  349.  
  350.         mov     dl,byte ptr [buffer]
  351.         cmp     dl,26           ;^Z terminating?
  352.         jz      Load_Ended
  353.  
  354.         mov     ah,2
  355.         int     21h
  356.         jmp     Load_loop
  357.  
  358. Load_Ended:
  359.         mov     bx,handle
  360.         mov     ah,3Eh
  361.         int     21h             ;close file
  362.  
  363.         mov     cx,0            ;home cursor
  364.         call    set_cur_pos
  365.         jmp     Editor
  366.  
  367. text_table db 14
  368.         db 8    ;bksp
  369.         db 13   ;RET
  370.         db 0,71 ;HOME
  371.         db 0,72 ;up
  372.         db 0,73 ;PgUp
  373.         db 0,75 ;lt
  374.         db 0,77 ;rt
  375.         db 0,79 ;END
  376.         db 0,80 ;dn
  377.         db 0,81 ;PgDn
  378.         db 27   ;ESC
  379.         db 0,82 ;INS
  380.         db 0,83 ;DEL
  381.         db 9    ;TAB
  382.  
  383. text_jmp_table db 14
  384.         dw offset key_bksp
  385.         dw offset key_cr
  386.         dw offset key_home
  387.         dw offset key_up
  388.         dw offset key_pgup
  389.         dw offset key_lt
  390.         dw offset key_rt
  391.         dw offset key_end
  392.         dw offset key_dn
  393.         dw offset key_pgdn
  394.         dw offset key_esc
  395.         dw offset key_ins
  396.         dw offset key_del
  397.         dw offset key_tab
  398.  
  399. cmd_key db 8, esc,'RCSLQWF'
  400.  
  401. cmd_table db 8
  402.         dw offset cmd_esc       ;toggle to/from text/cmd
  403.         dw offset cmd_R         ;replace (not implemented)
  404.         dw offset cmd_C         ;set Colors
  405.         dw offset cmd_S         ;Save file
  406.         dw offset cmd_L         ;Load file
  407.         dw offset cmd_Q         ;Quit tDoodle
  408.         dw offset cmd_W         ;Wipe out screen (cls)
  409.         dw offset cmd_F         ;Flip between screens
  410.  
  411. box_key_table db 14, 'QWEASDZXC-_\| '
  412. box_table_list label word
  413.         dw offset box_table_1
  414.         dw offset box_table_2
  415.         dw offset box_table_3
  416.         dw offset box_table_4
  417.  
  418. box_table_1 db 218,194,191,195,197,180,192,193,217,196,196,179,179,32
  419. box_table_2 db 201,203,187,204,206,185,200,202,188,205,205,186,186,32
  420. box_table_3 db 213,209,184,198,216,181,212,207,190,205,205,179,179,32
  421. box_table_4 db 214,210,183,199,215,182,211,208,189,196,196,186,186,32
  422.  
  423. fn_table db 10
  424.         db 0,59                 ;F1: rotate box modes
  425.         db 0,60                 ;F2: set csr attr to cur attr
  426.         db 0,61                 ;F3: reverse screen attribs
  427.         db 0,62                 ;F4: rotate paint/text/both 
  428.         db 0,63                 ;F5: show colors
  429.         db 0,64                 ;F6: Flip from one screen to the other
  430.         db 0,65                 ;F7: Pickup
  431.         db 0,66                 ;F8: PutDown
  432.         db 0,67                 ;F9: Undo
  433.         db 0,68                 ;F0: Macros
  434.  
  435. mode_update_table db 10
  436.         dw offset MU_boxes
  437.         dw offset MU_attrib
  438.         dw offset MU_reverse
  439.         dw offset MU_put_mode
  440.         dw offset MU_show_colors
  441.         dw offset MU_flip
  442.         dw offset MU_Pickup
  443.         dw offset MU_PutDown
  444.         dw offset MU_Undo
  445.         dw offset MU_Macros
  446.  
  447. key_bksp:
  448. key_lt: call    get_cur
  449.         cmp     cl,0
  450.         jz      KL_1
  451.         dec     cl
  452. SCP:    jmp     Set_cur_pos
  453. KL_1:   cmp     wrap_flag,255
  454.         jne     scp
  455.         mov     cl,78
  456. Key_up_2:
  457.         or      ch,ch
  458.         jz      Set_cur_pos
  459.         dec     ch
  460.         jmp     Set_Cur_pos
  461. Key_cr:
  462.         call    get_cur
  463.         cmp     ch,21
  464.         jz      Set_Cur_pos
  465.         inc     ch
  466.         mov     cl,0
  467.         jmp     Set_Cur_pos
  468. Key_rt: call    get_cur
  469.         cmp     cl,78
  470.         jne     KR_1
  471.         cmp     wrap_flag,255
  472.         jne     set_cur_pos
  473.         jmp     Key_cr
  474. KR_1:   inc     cl
  475. Set_cur_pos:
  476.         mov     ah,2
  477.         mov     bh,screen_page
  478.         mov     dx,cx
  479.         int     10h
  480.     cmp    say_color_flag,0
  481.     jz    SCP_ret
  482.         call    say_color
  483. SCP_ret:
  484.         ret
  485. Key_up: call    get_cur
  486.         jmp     Key_up_2
  487. Key_dn: call    get_cur
  488.         cmp     ch,21
  489.         jz      Set_cur_pos
  490.         inc     ch
  491.         jmp     Set_cur_pos
  492. Key_home:
  493.         mov     cx,0
  494.         jmp     Set_cur_pos
  495. Key_PgUp:
  496.         call    Key_up
  497.         call    key_rt
  498.         ret
  499. Key_PgDn:
  500.         call    Key_dn
  501.         call    key_rt
  502.         ret
  503. Key_End:
  504.         mov     cx,21*256
  505.         jmp     Set_cur_pos
  506. get_cur:
  507.         mov     ah,3
  508.         mov     bh,screen_page
  509.         int     10h
  510.         mov     cx,dx
  511.         ret
  512. key_esc:
  513.         clc
  514.         call    save_cur
  515.         pop     ax
  516.         ret
  517.  
  518. key_ins:
  519.         mov     bh,screen_page
  520.         mov     ah,3
  521.         int     10h
  522.         mov     cursor,dx
  523.         mov     al,attrib
  524.         push    ax
  525.  
  526.         mov     ins_del_flag,255
  527.         push    dx              ;save it for later
  528.         mov     dl,78           ;last col
  529.  
  530. KI_1:   dec     dl
  531.         mov     ah,2            ;set curpos
  532.         int     10h
  533.         mov     ah,8
  534.         int     10h             ;read c/a
  535.         mov     attrib,ah
  536.         push    ax
  537.  
  538.         inc     dl
  539.         mov     ah,2
  540.         int     10h
  541.         pop     ax
  542.         push    dx
  543.         call    alt_modes
  544.         pop     dx
  545.         mov     cx,1
  546.         mov     ah,9
  547.         int     10h             ;write c/a
  548.  
  549.         dec     dl
  550.         pop     cx
  551.         cmp     dl,cl
  552.         push    cx
  553.         jne     KI_1
  554.         pop     cx
  555.         mov     ah,2
  556.         int     10h             ;reset cursor
  557.  
  558.         pop     ax
  559.         mov     attrib,al
  560.         mov     al,32
  561.         call    alt_modes
  562.         mov     cx,1
  563.         mov     ah,9
  564.         int     10h
  565.  
  566.         mov     ins_del_flag,0
  567.         ret
  568.  
  569. key_del:
  570.         mov     bh,screen_page
  571.         mov     ah,3
  572.         int     10h             ;get curpos
  573.         mov     cursor,dx
  574.         mov     al,attrib
  575.         push    ax
  576.  
  577.         mov     ins_del_flag,255
  578.  
  579. kd_1:   inc     dl              ;next col over
  580.         mov     ah,2
  581.         int     10h
  582.         mov     ah,8
  583.         int     10h             ;get c/a
  584.         mov     attrib,ah
  585.         push    ax
  586.  
  587.         dec     dl
  588.         mov     ah,2
  589.         int     10h
  590.         pop     ax
  591.         push    dx
  592.         call    alt_modes
  593.         pop     dx
  594.         mov     cx,1
  595.         mov     ah,9
  596.         int     10h
  597.  
  598.         inc     dl
  599.         cmp     dl,78
  600.         jne     kd_1
  601.         mov     ah,2
  602.         int     10h
  603.  
  604.         pop     ax
  605.         mov     attrib,al
  606.         mov     al,32
  607.         call    alt_modes
  608.         mov     cx,1
  609.         mov     ah,9
  610.         int     10h
  611.  
  612.         mov     dx,cursor
  613.         mov     ah,2
  614.         int     10h
  615.         mov     ins_del_flag,0
  616.         ret
  617.  
  618. key_tab:
  619.         mov     bh,screen_page
  620.         mov     ah,3
  621.         int     10h             ;get curpos
  622.         mov     cl,3
  623.         sar     dl,cl
  624.         inc     dl
  625.         sal     dl,cl
  626.         and     dl,255-7
  627.         cmp     dl,78
  628.         jbe     kt_cont
  629.         mov     dl,78
  630.         cmp     dh,22
  631.         je      kt_cont
  632.         inc     dh
  633.         mov     dl,0
  634.  
  635. kt_cont:
  636.         mov     ah,2
  637.         int     10h
  638.         ret
  639.  
  640. fix_cursor_block:
  641.         mov     ah,15
  642.         int     10h             ;get screen mode
  643.         mov     screen_page,bh
  644.         mov     cx,12           
  645.         mov     dx,0B000h       ;mono seg
  646.         mov     say_color_flag,255
  647.         cmp     al,7            ;monochrome
  648.         jz      set_cursor_block
  649.         mov     cl,7
  650.         mov     dx,0B800h       ;cga seg
  651.         mov     say_color_flag,0
  652. set_cursor_block:
  653.         mov     screen_seg,dx
  654.         mov     ah,1
  655.         int     10h             ;set new cursor 
  656.         ret
  657.  
  658. restore_cursor_block:
  659.         mov     cx,cursor_size
  660.         mov     ah,1
  661.         int     10h
  662.         ret
  663.  
  664.  
  665. Editor: mov     attrib,7        ;default, white on black
  666.         mov     mode,0          ;text mode
  667. Editor_loop:
  668.         mov     wrap_flag,255
  669.         call    display_ctrls
  670.         call    mode_text       ;go update screen
  671.         call    mode_cmd
  672.         jnc     Editor_loop
  673.         call    restore_cursor_block
  674.         jmp     Ret_to_DOS_2
  675.  
  676. mode_text:
  677.         getkey  
  678.         jz      mode_text
  679.         push    ax
  680.         search  text_table,ax
  681.         jnz     MT_text
  682.         pop     dx
  683.         jump    text_jmp_table,ah
  684.         jmp     mode_text
  685. MT_text:
  686.         pop     ax              ;get back key
  687.         push    ax              ;and save it back
  688.         search  fn_table,ax
  689.         je      mode_update
  690.         pop     ax
  691.         or      al,al
  692.         jz      mode_text       ;bad keystroke
  693.         cmp     al,32
  694.         jb      mode_text
  695.         call    alt_modes
  696.         mov     cx,1
  697.         mov     ah,9
  698.         int     10h
  699.         call    key_rt
  700.         jmp     mode_text
  701.  
  702. mode_update:
  703.         pop     dx              ;clear stack
  704.         jump    mode_update_table,ah
  705.         mov     wrap_flag,255
  706.         jmp     mode_text
  707.  
  708. MU_boxes:
  709.         mov     ah,mode
  710.         test    ah,128
  711.         jz      F1_start
  712.         mov     al,ah
  713.         and     al,252
  714.         inc     ah
  715.         and     ah,3
  716.         or      ah,ah
  717.         jz      F1_end
  718.         or      ah,al
  719.         mov     mode,ah
  720.         call    display_ctrls
  721.         ret
  722. F1_end: and     al,127
  723.         mov     mode,al
  724.         call    display_ctrls
  725.         ret
  726. F1_start:
  727.         or      ah,128
  728.         and     ah,252
  729.         mov     mode,ah
  730.         call    display_ctrls
  731.         ret
  732.  
  733. MU_attrib:
  734.         mov     ah,8
  735.         mov     bh,screen_page
  736.         int     10h
  737.         mov     attrib,ah
  738.         call    display_ctrls
  739.         ret
  740.  
  741. MU_reverse:
  742.         mov     ah,attrib
  743.         mov     al,ah
  744.         mov     cl,4
  745.         ror     ah,cl
  746.         and     ah,255-(128+8)  ;clear int/blnk bits
  747.         and     al,128+8
  748.         or      ah,al           ;move old blnk/int into attribs
  749.         mov     attrib,ah
  750.         call    display_ctrls
  751.         ret
  752.  
  753. MU_put_mode:
  754.         mov     ah,mode
  755.         mov     cl,5
  756.         ror     ah,cl
  757.         and     ah,3
  758.         test    ah,1            ;not "both"?
  759.         jnz     MU_pm_1         ;go if not "both"
  760.         mov     ah,1
  761. MU_pm_3:
  762.         mov     al,mode
  763.         and     al,255-96       ;clear out current mode
  764.         rol     ah,cl
  765.         or      al,ah
  766.         mov     mode,al       ;set new one
  767.         call    display_ctrls
  768.         ret
  769. MU_pm_1:
  770.         xor     ah,2            ;set 0 to 1
  771.         test    ah,2            ;is it 0
  772.         jz      MU_pm_2
  773.         jmp     MU_pm_3
  774. MU_pm_2:
  775.         mov     ah,0
  776.         jmp     MU_pm_3
  777.  
  778.  
  779. mu_sc_setup db esc,'[24;1f$'
  780.  
  781. mu_sc_colors db 8
  782.         dw offset mu_black
  783.         dw offset mu_blue
  784.         dw offset mu_green
  785.         dw offset mu_cyan
  786.         dw offset mu_red
  787.         dw offset mu_magenta
  788.         dw offset mu_yellow
  789.         dw offset mu_white
  790.  
  791. mu_black        db 'Black$'
  792. mu_blue         db 'Blue$'
  793. mu_green        db 'Green$'
  794. mu_cyan         db 'Cyan$'
  795. mu_red          db 'Red$'
  796. mu_magenta      db 'Magenta$'
  797. mu_yellow       db 'Yellow$'
  798. mu_white        db 'White$'
  799.  
  800. mu_blinking     db 'Blinking$'
  801. mu_bright       db 'Bright$'
  802. mu_on           db 'on$'
  803. mu_comma        db 8,',$'
  804.  
  805. MU_show_colors:
  806.         xor     say_color_flag,255
  807.         cmp     say_color_flag,0
  808.         jne     say_color
  809.         ret
  810.  
  811. say_color:
  812.         push    ax
  813.         push    bx
  814.         push    cx
  815.         push    dx
  816.         push    si
  817.         push    di
  818.  
  819.         mov     bh,screen_page
  820.         mov     ah,8
  821.         int     10h             ;get c/a
  822.         push    ax
  823.  
  824.         mov     ah,3
  825.         int     10h             ;get curpos
  826.         mov     cursor,dx
  827.  
  828.         mov     dx,offset mu_sc_setup
  829.         call    print_cs
  830.  
  831.         pop     ax              ;get c/a
  832.         push    ax
  833.         test    ah,8            ;bright?
  834.         jz      MU_sc_1
  835.         mov     dx,offset mu_bright
  836.         call    print_cs_space
  837.         pop     ax 
  838.         push    ax
  839.         test    ah,128          ;blinking?
  840.         jz      mu_sc_1
  841.         mov     dx,offset mu_comma
  842.         call    print_cs_space
  843.         pop     ax
  844.         push    ax
  845. mu_sc_1:
  846.         test    ah,128          ;blinking?
  847.         jz      mu_sc_2
  848.         mov     dx,offset mu_blinking
  849.         call    print_cs_space
  850.         pop     ax
  851.         push    ax
  852. mu_sc_2:
  853.         and     ah,7            ;get foreground color
  854.         mov     al,ah
  855.         mov     ah,0
  856.         add     ax,ax
  857.         mov     bx,ax
  858.         inc     bx
  859.         mov     si,offset mu_sc_colors
  860.         mov     dx,[si+bx]
  861.         call    print_cs_space
  862.         mov     dx,offset mu_on
  863.         call    print_cs_space
  864.         pop     ax
  865.         mov     cl,4
  866.         ror     ah,cl
  867.         and     ah,7
  868.         mov     al,ah
  869.         mov     ah,0
  870.         add     ax,ax
  871.         mov     bx,ax
  872.         inc     bx
  873.         mov     dx,[si+bx]
  874.         call    print_cs
  875.  
  876.         mov     dx,cursor
  877.         mov     ah,2
  878.         mov     bh,screen_page
  879.         int     10h
  880.  
  881.         pop     di
  882.         pop     si
  883.         pop     dx
  884.         pop     cx
  885.         pop     bx
  886.         pop     ax
  887.         ret
  888.  
  889.  
  890. alt_modes:
  891.         test    mode,128        ;is graphic active?
  892.         jz      AM_paint        ;no, go check attr only
  893.         test    ins_del_flag,1  ;no box conv?
  894.         jnz     AM_paint
  895.         search  box_key_table,ax
  896.         je      AM_1
  897.         pop     ax              ;clear stack
  898.         jmp     mode_text
  899. AM_1:   mov     dl,mode
  900.         mov     dh,0
  901.         and     dl,3
  902.         add     dx,dx
  903.         mov     bx,offset box_table_list
  904.         add     bx,dx
  905.         mov     bx,cs:[bx]      ;get addr of xlat table
  906.         dec     ah
  907.         mov     al,ah
  908.         mov     ah,0
  909.         add     bx,ax
  910.         mov     al,cs:[bx]      ;get xlated box part
  911.  
  912. AM_paint:                       ;t/a lockout? 
  913.         push    ax
  914.         test    mode,32
  915.         jz      AM_normal
  916.         mov     bh,screen_page
  917.         mov     ah,8
  918.         int     10h             ;get c/a
  919.         test    mode,64         ;text only?
  920.         jz      AM_attr         ;no, attr only.
  921.         mov     bl,ah           ;set attr to what's under cur
  922.         mov     bh,screen_page
  923.         pop     ax              ;recover text
  924.         ret
  925.  
  926. AM_attr:
  927.         pop     dx              ;scrap old text
  928.         mov     bh,screen_page
  929.         mov     bl,attrib
  930.         ret
  931.  
  932. AM_normal:
  933.         pop     ax
  934.         mov     bh,screen_page
  935.         mov     bl,attrib
  936.         ret
  937.  
  938. mup_inst db esc,'[24;1fUse ',24,' ',25,' ',26,' and ',27,' to move,',13,10
  939.         db 'F7 to set other end of block, ESC to abort CUT.$'
  940.  
  941.  
  942. mu_Pickup:
  943.         call    save_screen
  944.         call    save_cur
  945.         mov     say_color_flag,0
  946.         mov     wrap_flag,0
  947.         mov     di,0700h
  948.         mov     si,00FFh        ;setup for CLS2
  949.         mov     dx,0            ;csrpos
  950.         mov     bh,screen_page
  951.         push    cursor
  952.         call    cls2
  953.         pop     cursor
  954.  
  955.         mov     dx,offset mup_inst
  956.         call    print_cs
  957.         call    restore_cur
  958.         mov     dx,cursor
  959.         mov     block_cursor,dx
  960.         mov     last_x,dl
  961.         mov     last_y,dh
  962.         call    fix_block
  963.  
  964. mup_1:  getkey
  965.         jz      mup_1
  966.         cmp     ax,4100h        ;F7?
  967.         je      mup_2
  968.  
  969.         search  text_table,ax
  970.         jne     mup_1
  971.         cmp     ah,2
  972.         je      mup_1
  973.         cmp     ah,3
  974.         je      mup_1
  975.         cmp     ah,8
  976.         je      mup_1
  977.         cmp     ah,12
  978.         je      mup_1
  979.         cmp     ah,13
  980.         je      mup_1
  981.         cmp     ah,11
  982.         je      mup_esc
  983.         jump    text_jmp_table,ah
  984.         call    fix_block
  985.         jmp     mup_1
  986. mup_esc:
  987.         call    restore_screen
  988.         call    display_ctrls
  989.         call    restore_cur
  990.         ret
  991.  
  992. mup_2:  mov     bh,screen_page
  993.         mov     ah,3            ;read curpos
  994.         int     10h
  995.         mov     cx,block_cursor
  996.         cmp     ch,dh           ;make DX hold bigger y/x
  997.         jbe     mup_3
  998.         xchg    ch,dh
  999. mup_3:  cmp     cl,dl
  1000.         jbe     mup_4
  1001.         xchg    cl,dl
  1002.  
  1003. mup_4:  push    dx              ;save bigger values
  1004.         sub     dx,cx
  1005.         inc     dl
  1006.         inc     dh              ;make go from 1
  1007.         mov     paste_size,dx   ;set y/x of block size
  1008.         pop     dx
  1009.  
  1010.         call    restore_screen
  1011.         mov     di,offset paste_buffer
  1012.         xchg    cx,dx           ;move small curpos to cursor register
  1013.         
  1014. mup_6:  push    dx
  1015. mup_5:  mov     ah,2
  1016.         int     10h
  1017.         mov     ah,8
  1018.         int     10h
  1019.         stosw
  1020.  
  1021.         cmp     dl,cl
  1022.         je      mup_next_line
  1023.         inc     dl
  1024.         jmp     mup_5
  1025.  
  1026. mup_next_line:
  1027.         pop     dx
  1028.         cmp     dh,ch
  1029.         je      mup_end
  1030.         inc     dh
  1031.         jmp     mup_6
  1032.  
  1033. mup_end:
  1034.         jmp     mup_esc
  1035.  
  1036.  
  1037. fb_y_more:
  1038.         jmp     fb_y_more_routine
  1039.  
  1040. fix_block:
  1041.         mov     bh,screen_page
  1042.         mov     ah,3
  1043.         int     10h             ;get curpos
  1044.         cmp     dl,last_x
  1045.         jb      fb_x_less
  1046.         ja      fb_x_more
  1047.         call    fb_center
  1048. fb_1:   cmp     dh,last_y
  1049.         jb      fb_y_less
  1050.         ja      fb_y_more
  1051.         call    fb_center
  1052. fb_2:   mov     last_x,dl
  1053.         mov     last_y,dh
  1054.         mov     ah,2
  1055.         int     10h             ;reset curpos
  1056.         ret
  1057.  
  1058. fb_x_less:
  1059.         cmp     dl,cursor_x
  1060.         jb      fbxl_less
  1061.  
  1062.         mov     cl,last_x
  1063.         cmp     dl,cl
  1064.         push    dx
  1065.         mov     attrib,7
  1066.         mov     dh,last_y
  1067.         jbe     fbxl_1
  1068.         xchg    dl,cl
  1069. fbxl_1: inc     dl
  1070.         call    fb_v_line
  1071.         cmp     dl,cl
  1072.         jne     fbxl_1
  1073.         pop     dx
  1074.         jmp     fb_1
  1075.  
  1076. fbxl_less:
  1077.         mov     cl,last_x
  1078.         cmp     dl,cl
  1079.         push    dx
  1080.         mov     attrib,7*16
  1081.         jae     fbxl_2
  1082.         xchg    dl,cl
  1083. fbxl_2: call    fb_v_line
  1084.         cmp     dl,cl
  1085.         je      fbxl_3
  1086.         dec     dl
  1087.         jmp     fbxl_2
  1088. fbxl_3: pop     dx
  1089.         jmp     fb_1
  1090.  
  1091. fb_x_more:
  1092.         cmp     dl,cursor_x
  1093.         ja      fbxl_less
  1094.  
  1095.         mov     cl,last_x
  1096.         push    dx
  1097.         mov     attrib,7
  1098.         mov     dh,last_y
  1099.         cmp     dl,cl
  1100.         jbe     fbxm_1
  1101.         xchg    dl,cl
  1102. fbxm_1: call    fb_v_line
  1103.         inc     dl
  1104.         cmp     dl,cl
  1105.         jne     fbxm_1
  1106.         pop     dx
  1107.         jmp     fb_1
  1108.  
  1109. fb_y_less:
  1110.         mov     quad,0
  1111.         cmp     dh,cursor_y
  1112.         mov     quad,0
  1113.         jb      fbyl_less
  1114.         mov     quad,255
  1115. fbym_1: mov     ch,last_y
  1116.         cmp     dh,ch
  1117.         push    dx
  1118.         mov     attrib,7
  1119.         mov     dl,last_x
  1120.         jbe     fbyl_1
  1121.         xchg    dh,ch
  1122. fbyl_1: call    fbyl_fix_quad_3_4
  1123. fbyl_2: call    fb_h_line
  1124.         inc     dh
  1125.         cmp     dh,ch
  1126.         jne     fbyl_2
  1127.         pop     dx
  1128.         jmp     fb_2
  1129.  
  1130. fbyl_less:
  1131.         mov     ch,last_y
  1132.         cmp     dh,ch
  1133.         push    dx
  1134.         mov     attrib,7*16
  1135.         jae     fbyl_4
  1136.         xchg    dh,ch
  1137. fbyl_4: dec     ch
  1138.  
  1139. fbyl_3: call    fb_h_line
  1140.         dec     dh
  1141.         cmp     dh,ch
  1142.         jne     fbyl_3
  1143.         pop     dx
  1144.         jmp     fb_2
  1145.  
  1146. fb_y_more_routine:
  1147.         cmp     dh,cursor_y
  1148.         mov     quad,255
  1149.         ja      fbyl_less
  1150.         mov     quad,0
  1151.         jmp     fbym_1
  1152.  
  1153. fbyl_fix_quad_3_4:
  1154.         test    quad,255
  1155.         jz      fbylfq34_ret
  1156.         inc     ch
  1157.         inc     dh
  1158. fbylfq34_ret:
  1159.         ret
  1160.  
  1161. fb_v_line:
  1162.         push    dx
  1163.         push    cx
  1164.         mov     bh,screen_page
  1165.  
  1166.         mov     ch,cursor_y
  1167.         cmp     dh,ch
  1168.         jbe     fbvl_1
  1169.         xchg    dh,ch
  1170.  
  1171. fbvl_1: mov     ah,2            ;set curpos
  1172.         int     10h
  1173.         mov     ah,8
  1174.         int     10h             ;read c/a
  1175.  
  1176.         push    cx
  1177.         mov     bl,attrib
  1178.         mov     cx,1
  1179.         mov     ah,9
  1180.         int     10h             ;write new attrib
  1181.         pop     cx
  1182.  
  1183.         cmp     dh,ch
  1184.         je      fbvl_2
  1185.         inc     dh
  1186.         jmp     fbvl_1
  1187.  
  1188. fbvl_2: pop     cx
  1189.         pop     dx
  1190.         ret
  1191.  
  1192. fb_h_line:
  1193.         push    dx
  1194.         push    cx
  1195.         mov     bh,screen_page
  1196.  
  1197.         mov     cl,cursor_x
  1198.         cmp     dl,cl
  1199.         jbe     fbhl_1
  1200.         xchg    dl,cl
  1201.  
  1202. fbhl_1: mov     ah,2            ;set curpos
  1203.         int     10h
  1204.         mov     ah,8
  1205.         int     10h             ;read c/a
  1206.  
  1207.         push    cx
  1208.         mov     bl,attrib
  1209.         mov     cx,1
  1210.         mov     ah,9
  1211.         int     10h             ;write new attrib
  1212.         pop     cx
  1213.  
  1214.         cmp     dl,cl
  1215.         je      fbhl_2
  1216.         inc     dl
  1217.         jmp     fbhl_1
  1218.  
  1219. fbhl_2: pop     cx
  1220.         pop     dx
  1221.         ret
  1222.  
  1223. fb_center:
  1224.         push    dx
  1225.         mov     ah,3
  1226.         int     10h
  1227.         pop     cx
  1228.         push    dx
  1229.         mov     dx,cx
  1230.         mov     ah,2
  1231.         int     10h
  1232.         
  1233.         mov     ah,8
  1234.         int     10h
  1235.         push    cx
  1236.         mov     bl,7*16
  1237.         mov     cx,1
  1238.         mov     ah,9
  1239.         int     10h
  1240.         pop     cx
  1241.  
  1242.         pop     dx
  1243.         mov     ah,2
  1244.         int     10h
  1245.         mov     dx,cx
  1246.         ret
  1247.  
  1248.  
  1249. mu_putdown:
  1250.         call    save_screen     ;save for later undo
  1251.         mov     al,attrib
  1252.         push    ax
  1253.         mov     ins_del_flag,255
  1254.  
  1255.         mov     bh,screen_page
  1256.         mov     ah,3
  1257.         int     10h             ;get curpos
  1258.         push    dx              ;save it
  1259.  
  1260.         mov     ah,22
  1261.         xchg    ah,dh
  1262.         sub     dh,ah
  1263.         mov     al,79
  1264.         xchg    al,dl
  1265.         sub     dl,al
  1266.  
  1267.         mov     cx,paste_size
  1268.         cmp     dh,ch           ;take smaller of two
  1269.         jbe     mupd_1
  1270.         mov     dh,ch
  1271. mupd_1: cmp     dl,cl
  1272.         jbe     mupd_2
  1273.         mov     dl,cl
  1274.  
  1275. mupd_2: mov     si,offset paste_buffer
  1276.         mov     cl,dh           ;get # lines to do
  1277.         mov     ch,0            ;into CX
  1278.         mov     bl,dl           ;get # cols
  1279.         mov     bh,0            ;into BX
  1280.         pop     dx              ;get cursor pos
  1281.         push    dx
  1282.  
  1283. mupd_4: push    dx              ;save cursor pos
  1284.         push    cx              ;save # lines to do
  1285.         push    si              ;save current paste_buffer position
  1286.         mov     cx,bx           ;get # cols to do
  1287.  
  1288. mupd_3: push    cx              ;save # cols left
  1289.         push    bx              ;save total cols to do
  1290.         mov     bh,screen_page
  1291.  
  1292.         mov     ah,2            ;set curpos
  1293.         int     10h
  1294.  
  1295.         lodsw                   ;get c/a from p_buff
  1296.         mov     attrib,ah
  1297.         push    dx
  1298.         push    si
  1299.         call    alt_modes
  1300.         pop     si
  1301.         pop     dx
  1302.         mov     cx,1
  1303.         mov     ah,9
  1304.         int     10h             ;write c/a from buffer
  1305.  
  1306.         pop     bx
  1307.         pop     cx              ;get # chrs to do
  1308.         inc     dl              ;next csr col
  1309.         loop    mupd_3
  1310.         pop     si              ;restore start of line in paste buffer
  1311.         mov     cx,paste_size
  1312.         mov     ch,0
  1313.         add     cx,cx
  1314.         add     si,cx
  1315.         pop     cx              ;get # lines left to do
  1316.         pop     dx              ;restore cursor pos
  1317.         inc     dh
  1318.         loop    mupd_4
  1319.  
  1320.         pop     dx
  1321.         mov     bh,screen_page
  1322.         mov     ah,2
  1323.         int     10h             ;restore curpos
  1324.  
  1325.         pop     ax
  1326.         mov     attrib,al
  1327.         mov     ins_del_flag,0
  1328.         ret
  1329.  
  1330. Macro_mess_1 db esc,'[24;1f',esc,'I give up. If you want macros, use ProKey or something.$'
  1331.  
  1332.  
  1333. MU_Macros:
  1334.         call    save_cur
  1335.         mov     dx,offset Macro_mess_1
  1336.         call    print_cs
  1337.         call    restore_cur
  1338.         ret
  1339.  
  1340.  
  1341. cmd_f:
  1342. MU_flip:
  1343.         mov     dx,offset screen_buffer_2
  1344.         cmp     screen_buffer, offset screen_buffer_1
  1345.         je      MUF_set
  1346.         mov     dx,offset screen_buffer_1
  1347. MUF_set:
  1348.         push    dx
  1349.         call    save_screen
  1350.         pop     dx
  1351.         mov     screen_buffer,dx
  1352.         call    restore_screen
  1353.         ret
  1354.  
  1355.  
  1356. wipe_prompt_1 db esc,'[24;1fAttributes, Text or Both (a/t/b)? $'
  1357. wipe_prompt_2 label byte
  1358. quit_prompt db esc,'[24;1fAre you sure (y/n)? $'
  1359. command_prompt db esc,'[24;1f',esc,'[0mCommand: $'
  1360. save_prompt db esc,'[24;1fSave to $'
  1361. CL_prompt db esc,'[24;1fLoad from $'
  1362. home db esc,'[1;1f$'
  1363. CL_err_mess db esc,'[24;1fError in Loading of file. Hit key to resume editing.$'
  1364. CS_err_mess db esc,'[24;1fError: Couldn',27h,'t save file. Hit key to resume editing.$'
  1365. crlf db 13,10
  1366. ctrl_z db 26
  1367.  
  1368.  
  1369. save_cur:
  1370.         mov     bh,screen_page
  1371.         mov     ah,3
  1372.         int     10h
  1373.         mov     cursor,dx
  1374.         ret
  1375.  
  1376. restore_cur:
  1377.         mov     bh,screen_page
  1378.         mov     ah,2
  1379.         mov     dx,cursor
  1380.         int     10h
  1381.         ret
  1382.  
  1383. get_filespec:
  1384.         call    print_cs
  1385.         call    save_screen
  1386.         push    si
  1387.         mov     dx,offset filespec_buffer
  1388.         mov     si,dx
  1389.         mov     bl,[si+1]
  1390.         mov     bh,0
  1391.         mov     byte ptr [si+bx+2],13
  1392.         xchg    bx,si
  1393.         pop     si
  1394.         mov     ah,0Ah
  1395.         int     21h             ;input filename
  1396.         mov     bx,offset filespec_buffer+2
  1397.         mov     dx,bx
  1398.         mov     al,[bx-1]
  1399.         mov     ah,0
  1400.         or      ax,ax
  1401.         jz      get_fs_ret_err
  1402.         add     bx,ax
  1403.         mov     byte ptr [bx],0
  1404.         push    bx
  1405.  
  1406. ;open file for r/w
  1407.         mov     al,2
  1408.         push    dx
  1409.         mov     ah,3Dh
  1410.         int     21h
  1411.         pop     dx
  1412.         pop     bx
  1413.         jnc     get_fs_ret
  1414.         test    create,255
  1415.         jz      get_fs_ret_err
  1416.         push    bx
  1417.         mov     ah,3Ch
  1418.         mov     cx,0
  1419.         mov     al,2
  1420.         int     21h
  1421.         pop     bx
  1422.         jnc     get_fs_ret
  1423. get_fs_ret_err:
  1424.         stc
  1425. get_fs_ret:
  1426.         mov     byte ptr [bx],13     ;set buffer back to normal
  1427.         call    restore_screen
  1428.         ret
  1429.  
  1430. adjust:
  1431.         mov     dl,max_col
  1432.         mov     dh,cur_line
  1433.         
  1434. adjust_loop:
  1435.         dec     dl
  1436.         cmp     dl,255
  1437.         jz      adjust_end
  1438.         mov     ah,2
  1439.         mov     bh,screen_page
  1440.         int     10h             ;set cur_pos
  1441.         mov     ah,8
  1442.         mov     bh,screen_page
  1443.         int     10h
  1444.         cmp     al,0
  1445.         je      adjust_loopB
  1446.         cmp     al,255
  1447.         je      adjust_loopB
  1448.         cmp     al,32
  1449.         je      adjust_loopB
  1450. adjust_end:
  1451.         inc     dl
  1452.         mov     max_col,dl
  1453. A_ret:
  1454.         ret
  1455.  
  1456. adjust_loopB:
  1457.         and     ah,7*16         ;test for background color on.
  1458.         jz      adjust_loop
  1459.         jmp     adjust_end
  1460.  
  1461.  
  1462.  
  1463. fix_attrib:
  1464.         cmp     ah,attrib
  1465.         je      A_ret
  1466.         push    dx
  1467.         push    cx
  1468.         push    bx
  1469.         push    ax              ;save c/a
  1470.         mov     bp,offset buffer+2
  1471.         push    bp
  1472.         mov     attrib,ah
  1473.         mov     byte ptr [bp],'0'
  1474.         inc     bp
  1475.         mov     byte ptr [bp],';'
  1476.         inc     bp
  1477.         mov     byte ptr [bp],'3'
  1478.         inc     bp
  1479.         and     ah,7
  1480.         call    xlat_colors
  1481.         add     ah,30h          ;make decimal
  1482.         mov     byte ptr [bp],ah
  1483.         inc     bp
  1484.         mov     byte ptr [bp],';'
  1485.         inc     bp
  1486.         test    attrib,16+32+64 ;background set?
  1487.         jz      no_background
  1488.         mov     byte ptr [bp],'4'
  1489.         inc     bp
  1490.         mov     ah,attrib
  1491.         mov     cl,4
  1492.         ror     ah,cl
  1493.         and     ah,7
  1494.         call    xlat_colors
  1495.         add     ah,30h
  1496.         mov     byte ptr [bp],ah
  1497.         inc     bp
  1498.         mov     byte ptr [bp],';'
  1499.         inc     bp
  1500. no_background:
  1501.         test    attrib,8
  1502.         jz      no_intensity
  1503.         mov     byte ptr [bp],'1'
  1504.         inc     bp
  1505.         mov     byte ptr [bp],';'
  1506.         inc     bp
  1507. no_intensity:
  1508.         test    attrib,128
  1509.         jz      no_blinking
  1510.         mov     byte ptr [bp],'5'
  1511.         inc     bp
  1512.         inc     bp
  1513. no_blinking:
  1514.         dec     bp
  1515.         mov     byte ptr [bp],'m'
  1516.         inc     bp
  1517.         pop     cx
  1518.         push    cx              ;save pointer to buffer
  1519.         xchg    cx,bp
  1520.         sub     cx,bp
  1521.         inc     cx
  1522.         inc     cx
  1523.         pop     bp              ;restore ptr
  1524.         mov     byte ptr [bp-2],27
  1525.         mov     byte ptr [bp-1],'['
  1526.         mov     dx,offset buffer
  1527.         mov     ah,40h
  1528.         mov     bx,handle
  1529.         int     21h
  1530.         pop     ax
  1531.         pop     bx
  1532.         pop     cx
  1533.         pop     dx
  1534.         ret
  1535.  
  1536. colors db 0,4,2,6,1,5,3,7
  1537.  
  1538. Xlat_Colors:
  1539.         push    bx
  1540.         push    ax
  1541.         mov     al,ah
  1542.         mov     bx,offset colors
  1543.         xlat    colors
  1544.         pop     bx
  1545.         mov     ah,al
  1546.         mov     al,bl
  1547.         pop     bx
  1548.         ret
  1549.  
  1550. color_list db esc,'[24;1f'
  1551.         db esc,'[0;30;5;47mB',esc,'[0;30;47mlack'                  ;Black
  1552.         db esc,'[0;34;1;40m b',esc,'[0;34;1;5mL',esc,'[0;34;1mue ' ;bLue
  1553.         db esc,'[0;32;1;5;40mG',esc,'[0;32;1mreen '                ;Green
  1554.         db esc,'[0;36;1;5;40mC',esc,'[0;36;1myan '                 ;Cyan
  1555.         db esc,'[0;31;1;5;40mR',esc,'[0;31;1med '                  ;Red
  1556.         db esc,'[0;35;1;5;40mM',esc,'[0;35;1magenta '              ;Magenta
  1557.         db esc,'[0;33;1;5;40mY',esc,'[0;33;1mellow '               ;Yellow
  1558.         db esc,'[0;37;1;5;40mW',esc,'[0;37;1mhite '                ;White
  1559.         db '$'
  1560. colors_table db 9, 'BLGCRMYW',ESC
  1561. color_fore_back db esc,'[24;1fForeground or Background (f/b)? $'
  1562. color_blinking_mess db esc,'[24;1fBlinking (y/n)? $'
  1563. color_int_mess db esc,'[24;1fBright (y/n)? $'
  1564.  
  1565. cmd_R:
  1566.  
  1567.         ret
  1568. cmd_C:
  1569.         mov     dx,offset color_fore_back
  1570.         call    print_cs
  1571. CC_1:   getkey
  1572.         jz      cc_1
  1573.         or      al,al
  1574.         jz      cc_1
  1575.         call    capit_al
  1576.         cmp     al,27
  1577.         je      cc_ret
  1578.         cmp     al,'F'
  1579.         mov     cl,0            ;rotate no bits.
  1580.         je      cc_get_color
  1581.         cmp     al,'B'
  1582.         mov     cl,4
  1583.         je      cc_get_color
  1584.         jmp     cc_1
  1585.  
  1586. cc_ret: ret
  1587.  
  1588. cc_get_color:
  1589.         mov     rotate,cl       ;save distance to rotate
  1590.         mov     dx,offset color_list
  1591.         call    print_cs
  1592. cc_2:   getkey
  1593.         jz      cc_2
  1594.         or      al,al
  1595.         jz      cc_2
  1596.         search  colors_table,ax
  1597.         JNE     CC_2
  1598.         CMP     AH,9
  1599.         JZ      CC_RET
  1600.         dec     ah              ;make a color
  1601.         mov     cl,rotate
  1602.         rol     ah,cl           ;set for attrib pos
  1603.         mov     al,attrib
  1604.         mov     dl,7            ;a mask
  1605.         rol     dl,cl           ;pos it
  1606.         or      al,dl
  1607.         xor     al,dl           ;remove unwanted bits
  1608.         or      al,ah           ;put in new bits
  1609.         mov     attrib,al
  1610.  
  1611.         or      cl,cl           ;doing foreground?
  1612.         jnz     cc_ret          ;no, skip other questions
  1613.  
  1614.         and     al,7+7*16       ;eliminate blink+intensity bits
  1615.         mov     attrib,al
  1616.  
  1617.         mov     dx,offset color_int_mess
  1618.         call    print_cs
  1619. cc_3:   getkey
  1620.         jz      cc_3
  1621.         or      al,al
  1622.         jz      cc_3
  1623.         call    capit_al
  1624.         cmp     al,esc
  1625.         jz      cc_ret
  1626.         cmp     al,'N'
  1627.         jz      cc_4
  1628.         cmp     al,'Y'
  1629.         jne     cc_3
  1630.         or      attrib,8
  1631. cc_4:   mov     dx,offset color_blinking_mess
  1632.         call    print_cs
  1633. cc_5:   getkey
  1634.         jz      cc_5
  1635.         or      al,al
  1636.         jz      cc_5
  1637.         call    capit_al
  1638.         cmp     al,esc
  1639.         jz      cc_ret2
  1640.         cmp     al,'N'
  1641.         jz      cc_ret2
  1642.         cmp     al,'Y'
  1643.         jne     cc_5
  1644.         or      attrib,128
  1645. cc_ret2:
  1646.         ret
  1647.  
  1648.  
  1649. CS_error:
  1650.         jmp     Save_error
  1651. cmd_S:
  1652.         mov     create,255
  1653.         mov     dx,offset save_prompt
  1654.         call    get_filespec
  1655.         jc      CS_error
  1656.         mov     handle,ax
  1657.         mov     attrib,7        ;set attrib to default
  1658.         mov     cur_line,21
  1659. save_start:
  1660.         cmp     cur_line,0
  1661.         jnz     ss_1
  1662.         jmp     nothing_to_save
  1663. ss_1:   mov     max_col,79
  1664.         call    adjust
  1665.         dec     cur_line
  1666.         cmp     max_col,0
  1667.         jz      save_start
  1668.         mov     al,cur_line
  1669.         inc     al
  1670.         inc     al
  1671.         mov     max_line,al
  1672.         mov     cur_line,0
  1673. Save_loop:
  1674.         mov     max_col,79
  1675.         mov     cur_col,0
  1676.         call    adjust
  1677.         inc     max_col
  1678.         mov     cl,max_col
  1679.         mov     ch,0
  1680.         push    cx
  1681. Save_line:
  1682.         pop     cx
  1683.         dec     cx
  1684.         jcxz    Save_line_done
  1685.         push    cx
  1686.         mov     dl,cur_col
  1687.         mov     dh,cur_line
  1688.         mov     bh,screen_page
  1689.         mov     ah,2
  1690.         int     10h
  1691.         mov     ah,8
  1692.         int     10h             ;get c/a from screen
  1693.         call    fix_attrib
  1694.         mov     byte ptr [buffer],al
  1695.         mov     cx,1
  1696.         mov     dx,offset buffer
  1697.         mov     ah,40h
  1698.         mov     bx,handle
  1699.         int     21h             ;write chr to file
  1700.         inc     cur_col
  1701.         jmp     Save_line
  1702.  
  1703. Save_line_done:
  1704.         inc     cur_line
  1705.         mov     dx,offset crlf
  1706.         mov     cx,2
  1707.         mov     bx,handle
  1708.         mov     ah,40h
  1709.         int     21h
  1710.         mov     al,cur_line
  1711.         cmp     al,max_line
  1712.         jz      Save_done
  1713.         jmp     Save_loop
  1714.  
  1715. Save_done:
  1716. Nothing_to_save:
  1717.         mov     dx,offset ctrl_z
  1718.         mov     cx,1
  1719.         mov     ah,40h
  1720.         mov     bx,handle
  1721.         int     21h
  1722.         jc      Save_error
  1723.         or      ax,ax
  1724.         jz      Save_error
  1725.         call    CL_Ended
  1726.         ret
  1727.  
  1728. Save_error:
  1729.         mov     dx,offset CS_err_mess
  1730.         call    print_cs
  1731.         mov     ah,0Ch
  1732.         mov     al,1
  1733.         int     21h
  1734.         ret
  1735.  
  1736. cmd_L:
  1737.         mov     create,0
  1738.         mov     dx,offset CL_prompt
  1739.         call    get_filespec
  1740.         jc      CL_error_2
  1741.         mov     handle,ax
  1742.         mov     dx,offset home
  1743.         call    print_cs
  1744. CL_loop:
  1745.         mov     bx,handle
  1746.         mov     ah,3Fh
  1747.         mov     cx,1
  1748.         mov     dx,offset buffer
  1749.         int     21h
  1750.         jc      CL_Error
  1751.         or      ax,ax
  1752.         jz      CL_Ended
  1753.  
  1754.         mov     dl,byte ptr [buffer]
  1755.         cmp     dl,26           ;^Z terminating?
  1756.         jz      CL_Ended
  1757.  
  1758.         mov     ah,2
  1759.         int     21h
  1760.         jmp     CL_loop
  1761.  
  1762. CL_Ended:
  1763.         mov     bx,handle
  1764.         mov     ah,3Eh
  1765.         int     21h             ;close file
  1766.         ret
  1767.  
  1768. CL_Error:
  1769.         call    CL_ended        ;close file
  1770. CL_error_2:
  1771.         mov     dx,offset CL_err_mess
  1772.         call    print_cs
  1773.         mov     ah,0Ch
  1774.         mov     al,1
  1775.         int     21h
  1776.         ret
  1777.  
  1778.  
  1779. cmd_Q:
  1780.         mov     dx,offset quit_prompt
  1781.         call    print_cs
  1782. quit_loop:
  1783.         getkey
  1784.         jz      quit_loop
  1785.         or      al,al
  1786.         jz      quit_loop       
  1787.         call    capit_al
  1788.         cmp     al,'N'
  1789.         je      quit_end
  1790.         cmp     al,esc
  1791.         je      quit_end
  1792.         cmp     al,'Y'
  1793.         jne     quit_loop
  1794.         pop     ax
  1795.         stc
  1796.         ret
  1797. quit_end:
  1798.         ret
  1799.  
  1800. cmd_M:
  1801.         ret
  1802. cmd_W:
  1803.         mov     dx,offset wipe_prompt_1
  1804.         call    print_cs
  1805. wl_1:   getkey
  1806.         jz      wl_1
  1807.         or      al,al
  1808.         jz      wl_1
  1809.         call    capit_al
  1810.         cmp     al,esc          ;ESC key hit?
  1811.         jz      wipe_end
  1812.         mov     dx,00FFh        ;attribs?
  1813.         mov     cx,0700h
  1814.         cmp     al,'A'
  1815.         jz      wl_2
  1816.         mov     dx,0FF00h       ;text
  1817.         mov     cx,0020h
  1818.         cmp     al,'T'
  1819.         jz      wl_2
  1820.         mov     dx,0000         ;both
  1821.         mov     cx,0720h
  1822.         cmp     al,'B'
  1823.         jnz     wl_1
  1824.  
  1825. wl_2:   push    dx
  1826.         push    cx
  1827.  
  1828.         mov     dx,offset wipe_prompt_2
  1829.         call    print_cs
  1830. wipe_loop:
  1831.         getkey
  1832.         jz      wipe_loop
  1833.         or      al,al
  1834.         jz      wipe_loop       
  1835.         call    capit_al
  1836.         cmp     al,'N'
  1837.         je      wipe_end
  1838.         cmp     al,esc
  1839.         je      wipe_end
  1840.         cmp     al,'Y'
  1841.         jne     wipe_loop
  1842.  
  1843.         pop     di
  1844.         pop     si
  1845.         mov     dx,0            ;new cursor pos
  1846.         mov     bh,screen_page
  1847.  
  1848. cls2:   mov     ah,2            ;set curpos
  1849.         int     10h
  1850.  
  1851.         mov     ah,8            ;read c/a
  1852.         int     10h
  1853.         and     ax,si           ;clear unwanted part
  1854.         or      ax,di           ;move in new replacement
  1855.         mov     bl,ah
  1856.         mov     cx,1
  1857.         mov     ah,9 
  1858.         int     10h             ;write new c/a
  1859.  
  1860.         inc     dl
  1861.         cmp     dl,79
  1862.         jne     cls2
  1863.         mov     dl,0
  1864.         inc     dh
  1865.         cmp     dh,22
  1866.         jne     cls2
  1867.  
  1868.         mov     cursor,0
  1869.         mov     attrib,7
  1870.  
  1871. wipe_end:
  1872.         ret
  1873.  
  1874. cmd_esc:
  1875.         clc
  1876.         pop     ax
  1877.         call    restore_cur
  1878.         ret
  1879.  
  1880. mode_cmd:
  1881.         mov     dx,offset command_prompt
  1882.         call    print_cs
  1883. MC_key_loop:
  1884.         getkey
  1885.         jz      MC_key_loop
  1886.         search  cmd_key,ax
  1887.         jne     MC_key_loop
  1888.         jump    cmd_table,ah
  1889.         jmp     mode_cmd
  1890.  
  1891. status_line_1 db esc,'[23;1f',esc,'[0;40;33;7mtDoodle 1.00                  '
  1892.         db '     Mode: $'
  1893. status_line_2 db 'Current Attribute',esc,'[0;40;33;7m         Box: $'
  1894. status_line_3 db esc,'[0;6m$'
  1895.  
  1896. status_line_4 db 'Paint  $'
  1897. status_line_5 db 'Text   $'
  1898. status_line_6 db 'Both   $'
  1899.  
  1900. status_line_help db 10,13,esc,'[K'
  1901.         db esc,'[0;1m1',esc,'[0;7mBox   '
  1902.         db esc,'[0;1m 2',esc,'[0;7mGetClr'
  1903.         db esc,'[0;1m 3',esc,'[0;7mRevers'
  1904.         db esc,'[0;1m 4',esc,'[0;7mMode  '
  1905.         db esc,'[0;1m 5',esc,'[0;7mSayClr'
  1906.         db esc,'[0;1m 6',esc,'[0;7mFlip  '
  1907.         db esc,'[0;1m 7',esc,'[0;7mCut   '
  1908.         db esc,'[0;1m 8',esc,'[0;7mPaste '
  1909.         db esc,'[0;1m 9',esc,'[0;7mUndo  '
  1910.         db esc,'[0;1m 0',esc,'[0;7mMacros'
  1911.         db esc,'[0m$'
  1912.  
  1913. display_ctrls:
  1914.         push    cursor
  1915.         call    save_cur
  1916.         mov     dx,offset status_line_1
  1917.         call    print_cs
  1918.  
  1919.         mov     ah,mode
  1920.         mov     cl,5
  1921.         ror     ah,cl
  1922.         mov     dx,offset status_line_6
  1923.         and     ah,3          
  1924.         jz      DC_2
  1925.         mov     dx,offset status_line_4
  1926.         dec     ah
  1927.         jz      DC_2
  1928.         mov     dx,offset status_line_5
  1929. DC_2:   call    print_cs
  1930.  
  1931.         mov     handle,0        ;con:
  1932.         mov     ah,attrib
  1933.         push    ax
  1934.         mov     ah,0            ;force attrib change
  1935.         call    fix_attrib
  1936.         pop     ax
  1937.         call    fix_attrib
  1938.  
  1939.         mov     dx,offset status_line_2
  1940.         call    print_cs
  1941.  
  1942.         mov     al,'S'
  1943.         call    alt_modes
  1944.         cmp     al,'S'
  1945.         jnz     DC_1
  1946.         mov     al,'T'
  1947. DC_1:   mov     dl,al
  1948.         mov     ah,02
  1949.         int     21h
  1950.         mov     dx,offset status_line_3
  1951.         call    print_cs
  1952.  
  1953.         mov     dx,offset status_line_help
  1954.         mov     ah,9
  1955.         int     21h             ;print mess w/no crlf
  1956.  
  1957.         call    restore_cur
  1958.         pop     cursor
  1959.         ret
  1960.  
  1961. screen_buffer_1 label word
  1962.         org     $+1760*2+2
  1963. screen_buffer_2 label word
  1964.         org     $+1760*2+2
  1965. paste_buffer label byte
  1966.         org     $+1760*2+2
  1967. end_of_code label byte
  1968.  
  1969. cseg    ends
  1970.         end     start
  1971.